// 该文件中的代码旨在完成对安装确认前的条件的核验，
// 总概括代码的返回值可提供至引用它的地方，供上级代码参考。


// 头文件引用
// 官方库
#include <cstring>
#include <fstream>
#include <filesystem>

// 项目专用函数库
#include "GetEnvironmentCommon.h"





// 获取命令框返回的字符串
std::string getmessage(std::string Commands) {

    FILE* MyCommandReturn = _popen(Commands.c_str(), "r");
    if (!MyCommandReturn) {
        // std::cerr << "popen() failed!" << std::endl;
        return "Error"; // 异常情况下，返回目标环境已安装，进行保命
    }

    // 创建字符串，为接下来获取输出数据做准备
    char FirstLineMSG[256];
    fgets(FirstLineMSG, 256, MyCommandReturn);
    _pclose(MyCommandReturn);

    // 去除换行符
    if (*(FirstLineMSG + (strlen(FirstLineMSG) - 1)) == '\n')
        *(FirstLineMSG + (strlen(FirstLineMSG) - 1)) = '\0';

    std::string UserMessage = FirstLineMSG;
    return UserMessage; // 返回获取的字符串
}


// 判断有无目标环境
int JudgeEnvironment(std::string UserMessage, std::string StandardMessage, int CheckDigit,
                     std::string HalfStandardMessage) {

    int JudgeFlag = 0;

    // 程序异常时
    if (UserMessage == "Error")
        JudgeFlag = -1;

    // 已安装该版本的环境
    else if (UserMessage == StandardMessage)
        JudgeFlag = 0;

    else {
        
        std::string UserMessage2 = UserMessage.substr(0, CheckDigit);  // 取字符串前 %CheckDigit% 位

        // 已安装其它版本的该环境
        if (UserMessage2 == HalfStandardMessage)
            JudgeFlag = 2;

        // 未安装该环境
        else
            JudgeFlag = 1;
    }

    return JudgeFlag;
}


// 点击安装按钮前，检查用户是否有目标环境的安装条件
int CheckDevEnvironmentA(std::string Commands, std::string StandardMessage, int CheckDigit) {
    std::string UserMessage = getmessage(Commands); // 模拟环境命令，获取执行结果
    std::string HalfStandardMessage = StandardMessage.substr(0, CheckDigit); // 获取标准对照的前 %CheckDigit% 位

    int CheckDevEnvironmentA_Return; // 创建返回表
    // 返回表数值含义：
    // 1 - 环境未安装
    // 2 - 相同版本的环境已安装
    // 3 - 不同版本的环境已安装
    // 4 - 环境有无情况判断异常

    int InstallFlag = JudgeEnvironment(UserMessage, StandardMessage, CheckDigit, HalfStandardMessage); // 判断有无目标环境
    if (InstallFlag == 1)
        CheckDevEnvironmentA_Return = 1; // 1 - 环境未安装
    else if (InstallFlag == 0)
        CheckDevEnvironmentA_Return = 2; // 2 - 相同版本的环境已安装
    else if (InstallFlag == 2)
        CheckDevEnvironmentA_Return = 3; // 3 - 不同版本的环境已安装
    else/* if (InstallFlag == -1)*/
        CheckDevEnvironmentA_Return = 4; // 4 - 环境有无情况判断异常

    return CheckDevEnvironmentA_Return;
}